package br.com.saeng2D.objeto.forca_d;

import br.com.saeng2D.objeto.forca.ForcaCentralizada2;
import br.com.saeng2D.objeto.linha.Linha;
import br.com.saeng2D.objeto.ponto.Ponto;
import br.com.saeng2D.util.Constantes;
import br.com.saeng2D.util.Util;
import br.com.saeng2D.util.Vetor;

public class IncluirForcaDinamica {
	
	public ForcaDinamica incluirForcaDistribuida(String corForca , String corVariavelF,Linha linha , int grau , String valorForca){
		
		ForcaDinamica forcaDinamica = new ForcaDinamica(corForca);
		forcaDinamica.setLinha(linha);
		
		int MULTIPLICADOR = 1;
		final int COMPRIMENTO_LINHA_P = (int) linha.getComprimento();
		final int PREF_DISTANCIA_SETA = Util.getInt("pref_distancia_entre_setaD");
		int QTD_RETAS_ADICIONAR = COMPRIMENTO_LINHA_P / PREF_DISTANCIA_SETA;
		if(COMPRIMENTO_LINHA_P % PREF_DISTANCIA_SETA != 0) {
			QTD_RETAS_ADICIONAR++;
		}
		final int DISTANCIA_REAL_ENTRE_SETAS = COMPRIMENTO_LINHA_P / QTD_RETAS_ADICIONAR; 
		Vetor vetor = linha.criarVetor();
		Vetor teste = linha.criarVetor();
		final int COMPRIMENTO_SETA = Util.getInt("comprimento_seta_dinamica"); 
		vetor.alterarTamanho(COMPRIMENTO_SETA);
		teste.alterarTamanho(Util.getInt("tamanho_padrao_forca_centralizada"));
		if(linha.ehVertical() || linha.ehHorizontal()) {
			if(linha.getPonto2().yMenorQue(linha.getPonto1())) {
				MULTIPLICADOR = -1;
			} else if(linha.getPonto2().xMenorQue(linha.getPonto1())) {
				MULTIPLICADOR = -1;
			}
		} else {
			if(linha.getPonto1().yMenorQue(linha.getPonto2())) {
				if(linha.getPonto2().xMenorQue(linha.getPonto1())) {
					MULTIPLICADOR = -1;
				}
			} else {
				if(linha.getPonto2().xMenorQue(linha.getPonto1())) {
					MULTIPLICADOR = -1;
				}
			}
		}
		
		final int GRAUS = grau * MULTIPLICADOR;
		vetor.rotacionar(GRAUS);
		teste.rotacionar(GRAUS);
		
		int v_x = (int) vetor.x;
		int v_y = (int) vetor.y * -1;				
		int p_x1 = (int) (linha.getPonto1().getX() + v_x);
		int p_y1 = (int) (linha.getPonto1().getY() + v_y);
		int p_x2 = (int) (linha.getPonto2().getX() + v_x);
		int p_y2 = (int) (linha.getPonto2().getY() + v_y);

		Reta retaParalela = new Reta(p_x1, p_y1, p_x2, p_y2);
		forcaDinamica.adicionarFilho(retaParalela);
		
		String stringVariavForca = valorForca;
		Linha linhaVariavelForca = new Linha(new Ponto(p_x1, p_y1), new Ponto(p_x2, p_y2));
		Vetor vetorVariavelForca = linhaVariavelForca.criarVetor();
		vetorVariavelForca.alterarTamanho((int) (linhaVariavelForca.getComprimento() / 2));
		Ponto pontoVariavelForca = new Ponto((int)(linhaVariavelForca.getPonto1().getX() + vetorVariavelForca.x), (int)(linhaVariavelForca.getPonto1().getY() + vetorVariavelForca.y * -1 + 15));
		
		Reta reta = new Reta(linha.getPonto1().getX(), linha.getPonto1().getY(), p_x1, p_y1);
		forcaDinamica.adicionarFilho(reta);
		Vetor v = reta.criarVetor();
		v.alterarTamanho(8);
		v.rotacionar(40);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto1(), v));
		v.rotacionar(-80);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto1(), v));
		
		reta = new Reta(linha.getPonto2().getX(), linha.getPonto2().getY(), p_x2, p_y2);
		forcaDinamica.adicionarFilho(reta);
		v = reta.criarVetor();
		v.alterarTamanho(8);
		v.rotacionar(40);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto2(), v));
		v.rotacionar(-80);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto2(), v));

		Linha linhaParalela = new Linha(new Ponto(p_x1, p_y1), new Ponto(p_x2, p_y2));
		
		for(int i=1; i<QTD_RETAS_ADICIONAR; i++) {
			int tamanho = i * DISTANCIA_REAL_ENTRE_SETAS; 
			Vetor vetorLinha = linha.criarVetor();
			vetorLinha.alterarTamanho(tamanho);
			vetorLinha.y *= -1;				

			Vetor vetorParalelo = linhaParalela.criarVetor();
			vetorParalelo.alterarTamanho(tamanho);
			vetorParalelo.y *= -1;				

			reta = new Reta((int)(linha.getPonto1().getX() + vetorLinha.x), 
					  		(int)(linha.getPonto1().getY() + vetorLinha.y), 
					  		(int)(linhaParalela.getPonto1().getX() + vetorParalelo.x), 
					  		(int)(linhaParalela.getPonto1().getY() + vetorParalelo.y)); 
			forcaDinamica.adicionarFilho(reta);
			v = reta.criarVetor();
			v.alterarTamanho(8);
			v.rotacionar(40);
			forcaDinamica.adicionarFilho(new Reta(	(int)(linha.getPonto1().getX() + vetorLinha.x),
													(int)(linha.getPonto1().getY() + vetorLinha.y), v));
			v.rotacionar(-80);
			forcaDinamica.adicionarFilho(new Reta(	(int)(linha.getPonto1().getX() + vetorLinha.x),
													(int)(linha.getPonto1().getY() + vetorLinha.y), v));
		}
		
		vetor = linha.criarVetor();
		int m = (int) (linha.getComprimento() / 2);
		vetor.alterarTamanho(m);
		Ponto ponto = new Ponto((int)(linha.getPonto1().getX() + vetor.x), (int)(linha.getPonto1().getY() + vetor.y * -1));
		ponto.setPreenchido(true);
		ponto.setCorFundo(Util.getCor(corForca));
		linha.setPontoCentral(ponto);
		
		forcaDinamica.setVariavelForca(stringVariavForca);
		forcaDinamica.setPontoVariavelForca(pontoVariavelForca);
		forcaDinamica.setCorVariavelForca(Util.getCor(corVariavelF));
		
		ForcaCentralizada2 forcaC = new ForcaCentralizada2(teste, ponto.getX(), ponto.getY());
		forcaC.setVariavelForca("" + (int)((linha.getComprimento() / Constantes.ESCALA_REAL) * Integer.parseInt(stringVariavForca)));
		forcaC.setCorFundo(Util.getCor(corForca));
		
		linha.setForcaCentralizada2(forcaC);
		
		return forcaDinamica;
	}
	
	public ForcaDinamica incluirForcaTriangular(String corForca , String corVariavelF,Linha linha , int grau , String valorForca){
		
		ForcaDinamica forcaDinamica = new ForcaDinamica(corForca);
		forcaDinamica.setLinha(linha);
		
		int MULTIPLICADOR = 1;
		final int COMPRIMENTO_LINHA_P = (int) linha.getComprimento();
		final int PREF_DISTANCIA_SETA = Util.getInt("pref_distancia_entre_setaT");
		int QTD_RETAS_ADICIONAR = COMPRIMENTO_LINHA_P / PREF_DISTANCIA_SETA;
		if(COMPRIMENTO_LINHA_P % PREF_DISTANCIA_SETA != 0) {
			QTD_RETAS_ADICIONAR++;
		}
		final int DISTANCIA_REAL_ENTRE_SETAS = COMPRIMENTO_LINHA_P / QTD_RETAS_ADICIONAR; 
		Vetor vetorMaior = linha.criarVetor();
		Vetor vetorMenor = linha.criarVetor();
		Vetor teste = linha.criarVetor();
		final int COMPRIMENTO_SETA_MAIOR = Util.getInt("comprimento_seta_dinamica_maior"); 
		final int COMPRIMENTO_SETA_MENOR = Util.getInt("comprimento_seta_dinamica_menor"); 
		vetorMaior.alterarTamanho(COMPRIMENTO_SETA_MAIOR);
		vetorMenor.alterarTamanho(COMPRIMENTO_SETA_MENOR);
		teste.alterarTamanho(Util.getInt("tamanho_padrao_forca_centralizada"));
		if(linha.ehVertical() || linha.ehHorizontal()) {
			if(linha.getPonto2().yMenorQue(linha.getPonto1())) {
				MULTIPLICADOR = -1;
			} else if(linha.getPonto2().xMenorQue(linha.getPonto1())) {
				MULTIPLICADOR = -1;
			}
		} else {
			if(linha.getPonto1().yMenorQue(linha.getPonto2())) {
				if(linha.getPonto2().xMenorQue(linha.getPonto1())) {
					MULTIPLICADOR = -1;
				}
			} else {
				if(linha.getPonto2().xMenorQue(linha.getPonto1())) {
					MULTIPLICADOR = -1;
				}
			}					
		}
		
		final int GRAUS = grau * MULTIPLICADOR;
		vetorMaior.rotacionar(GRAUS);
		vetorMenor.rotacionar(GRAUS);
		teste.rotacionar(GRAUS);
		
		int v_x1 = (int) vetorMaior.x;
		int v_y1 = (int) vetorMaior.y * -1;				

		int v_x2 = (int) vetorMenor.x;
		int v_y2 = (int) vetorMenor.y * -1;				

		int p_x1 = (int) (linha.getPonto1().getX() + v_x1);
		int p_y1 = (int) (linha.getPonto1().getY() + v_y1);
		
		int p_x2 = (int) (linha.getPonto2().getX() + v_x2);
		int p_y2 = (int) (linha.getPonto2().getY() + v_y2);

		Reta retaTriangular = new Reta(p_x1, p_y1, p_x2, p_y2);
		forcaDinamica.adicionarFilho(retaTriangular);
		
		String stringVariavForca = valorForca;
		Linha linhaVariavelForca = new Linha(new Ponto(p_x1, p_y1), new Ponto(p_x2, p_y2));
		Vetor vetorVariavelForca = linhaVariavelForca.criarVetor();
		vetorVariavelForca.alterarTamanho((int) (linhaVariavelForca.getComprimento() / 2));
		Ponto pontoVariavelForca = new Ponto((int)(linhaVariavelForca.getPonto1().getX() + vetorVariavelForca.x), (int)(linhaVariavelForca.getPonto1().getY() + vetorVariavelForca.y * -1 + 15));
		
		Reta reta = new Reta(linha.getPonto1().getX(), linha.getPonto1().getY(), p_x1, p_y1);
		forcaDinamica.adicionarFilho(reta);
		Vetor v = reta.criarVetor();
		v.alterarTamanho(8);
		v.rotacionar(40);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto1(), v));
		v.rotacionar(-80);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto1(), v));
		
		reta = new Reta(linha.getPonto2().getX(), linha.getPonto2().getY(), p_x2, p_y2);
		forcaDinamica.adicionarFilho(reta);
		v = reta.criarVetor();
		v.alterarTamanho(8);
		v.rotacionar(40);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto2(), v));
		v.rotacionar(-80);
		forcaDinamica.adicionarFilho(new Reta(linha.getPonto2(), v));

		Linha linhaTriangular = new Linha(new Ponto(p_x1, p_y1), new Ponto(p_x2, p_y2));
		
		for(int i=1; i<QTD_RETAS_ADICIONAR; i++) {
			int tamanho = i * DISTANCIA_REAL_ENTRE_SETAS; 
			Vetor vetorLinha = linha.criarVetor();
			vetorLinha.alterarTamanho(tamanho);
			vetorLinha.y *= -1;				

			Vetor vetorParalelo = linhaTriangular.criarVetor();
			vetorParalelo.alterarTamanho(tamanho);
			vetorParalelo.y *= -1;				

			reta = new Reta((int)(linha.getPonto1().getX() + vetorLinha.x), 
					  		(int)(linha.getPonto1().getY() + vetorLinha.y), 						  
					  		(int)(linhaTriangular.getPonto1().getX() + vetorParalelo.x), 
					  		(int)(linhaTriangular.getPonto1().getY() + vetorParalelo.y));
			forcaDinamica.adicionarFilho(reta);
			v = reta.criarVetor();
			v.alterarTamanho(8);
			v.rotacionar(40);
			forcaDinamica.adicionarFilho(new Reta(	(int)(linha.getPonto1().getX() + vetorLinha.x),
													(int)(linha.getPonto1().getY() + vetorLinha.y), v));
			v.rotacionar(-80);
			forcaDinamica.adicionarFilho(new Reta(	(int)(linha.getPonto1().getX() + vetorLinha.x),
													(int)(linha.getPonto1().getY() + vetorLinha.y), v));
		}
		
		Vetor vetor = linha.criarVetor();
		int m = (int) (linha.getComprimento() / 3);
		vetor.alterarTamanho(m);
		Ponto ponto = new Ponto((int)(linha.getPonto1().getX() + vetor.x), (int)(linha.getPonto1().getY() + vetor.y * -1));
		ponto.setPreenchido(true);
		ponto.setCorFundo(Util.getCor(corForca));
		linha.setPontoCentral(ponto);
		
		forcaDinamica.setVariavelForca(stringVariavForca);
		forcaDinamica.setPontoVariavelForca(pontoVariavelForca);
		forcaDinamica.setCorVariavelForca(Util.getCor(corVariavelF));
		
		ForcaCentralizada2 forcaC = new ForcaCentralizada2(teste, ponto.getX(), ponto.getY());
		forcaC.setVariavelForca("" + (int)((m / Constantes.ESCALA_REAL) * Integer.parseInt(stringVariavForca)));
		forcaC.setCorFundo(Util.getCor(corForca));
		linha.setForcaCentralizada2(forcaC);
		
		return forcaDinamica;
	}

}
